import java.util.*;

/**
 * @author admin
 * 350. 两个数组的交集 II
 * //解法：对短的数组先做处理，用HashMap统计每个数字出现的次数，然后遍历长的数组得到交集。如果有这个数，则将次数减一，并将该数字存入数组，当次数小于0，移除该数字。
 */
public class LeeCode350 {

    public int[] intersect(int[] nums1, int[] nums2) {

        if(nums2.length < nums1.length){
            return intersect(nums2, nums1);
        }

        HashMap<Integer, Integer> hashMap = new HashMap<Integer, Integer>();
        for (int num : nums1) {
            int count = hashMap.getOrDefault(num,0) + 1;
            hashMap.put(num,count);
        }

//        结果集
        int[] ints = new int[nums1.length];
//        下标
        int index = 0;
        for (int num : nums2) {
            Integer count = hashMap.getOrDefault(num, 0);
            if (count > 0) {
                ints[index] = num;
                index++;
                count--;
                if (count > 0) {
                    hashMap.put(num, count);
                } else {
                    hashMap.remove(num);
                }
            }

        }
        return Arrays.copyOfRange(ints,0,index);

    }

    public static void main(String[] args) {

        int []nums1 = new int[]{4,9,5};
        int []nums2 = new int[]{9,4,9,8,4};
        LeeCode350 leeCode350 = new LeeCode350();
        int[] intersect = leeCode350.intersect(nums1, nums2);
        System.out.println(intersect.length);
    }
}
